return {
  {
    "mfussenegger/nvim-dap",
    recommended = true,
    desc = "Debugging support. Requires language specific adapters to be configured. (see lang extras)",

    dependencies = {
      {

        "rcarriga/nvim-dap-ui",
        opts = {
          variables = {
            value_format = "%d:%x", -- 十进制和十六进制格式
          },
        },
      },
      -- virtual text for the debugger
      --
      {
        "theHamsta/nvim-dap-virtual-text",
        opts = {},
      },
    },
  -- stylua: ignore
    keys = {
      {"<f4>", function() require("dap").terminate() end, desc = "dap terminate"},
      {"<f5>", function() require("dap").continue() end, desc = "dap launch/continue"},
      {"<f8>", function() require("dap").step_out() end, desc = "step out"},
      {"<f9>", function() require("dap").step_into() end, desc = "step into"},
      {"<f10>", function() require("dap").step_over() end, desc = "step over"},
    },
    opts = function()
      local dap = require("dap")
      dap.set_log_level("ERROR")
    end,
  },
  {
    "theHamsta/nvim-dap-virtual-text",
    opts = {
      enabled = true,
      enabled_commands = true,
      highlight_changed_variables = true,
      highlight_new_as_changed = false,
      show_stop_reason = true,
      commented = false,
      only_first_definition = true,
      all_references = false,
      clear_on_continue = false,
      display_callback = function(variable, buf, stackframe, node, options)
        if options.virt_text_pos == "inline" then
          return " = " .. variable.value:gsub("%s+", " ")
        else
          return variable.name .. " = " .. variable.value:gsub("%s+", " ")
        end
      end,
      virt_text_pos = vim.fn.has("nvim-0.10") == 1 and "inline" or "eol",
      all_frames = false,
      virt_lines = false,
      virt_text_win_col = nil,
    },
  },
  {
    "LiadOz/nvim-dap-repl-highlights",
    config = function()
      require("nvim-dap-repl-highlights").setup()
    end,
  },
}
